MEMAC A:
Das ist deutlich schwieriger umzusetzen. In der Theorie relativ klar und einfach ging es jetzt darum, einen brauchbaren Code umzusetzen.
Da habe ich jetzt einige Tage dran getüftelt!
Zunächst zur Theorie:
Wie oben schon erklärt, ist man mit MEMAC A deutlich flexibler, da man die Bankgröße und die Banklage variabel gestalten kann.
Für MEMAC A brauchen wir 2 Register: $5E und $5F - wobei es ja eigentlich $D65E oder $D75E und $D65F oder $D75F ist. Dies wurde oben ja schon erklärt und im folgenden schreibe ich hier für die Register nur noch z.B. $5E oder analog $Dx5E wobei für x dann enteder 6 oder 7 steht - je nach Lage der Register des VBXE. Das hat auch im Programm Bedeutung!!
Mit dem Register $5E steuern wir die Lage der Banks im Atarispeicher, ob CPU und oder Antic zugreifen können und wie groß die Bank ist (4kB, 8kB, 16 kB oder 32kB):
Bit 0 und 1 legen die Größe der Banks fest, Bit 2 enabled den Antic, Bit 3 die CPU, Bit 4-7 die Lage im Speicher. Hier steht der Hi-Byte-Wert der Lage!
Beispiel:
Ich möchte eine 8kB große Bank für die CPU an Stelle $9000 initialisieren. Der Befehl wäre dann:
ldy #$5e
lda #%10011001
sta (baseaddr),y
oder
lda #%10011001
sta $Dx5e
mit lda #%10011001 setzte ich Bit 7 und Bit 4 (=9 für $9000), Bit 3 für CPU enable und Bit 0 für 8 kB.
Jetzt noch die entsprechende Bank anwählen - und das geht mit dem Register $5F bzw. $Dx5F
Das ist dann relativ einfach:
Bit 0-6 bei 4kB Banks
Bit 1-6 bei 8kB Banks
Bit 2-6 bei 16kB Banks und
Bit 3-6 bei 32kb Banks
Bit 7 sollte dabei auf 1 gesetzt werden, damit wird MEMAC A global fixiert.
Und nun zum Code:
Zunächst habe ich im Hauptcode 2 neue Subroutinen:
.proc memacaini
lda #%10011000
sta $d65e
sta $d75e
rts
.endp
.proc bankx
jsr memacaini
txa
adc #128
sta $d65f
sta $d75f
rts
.endp
memacaini initiaslisiert Register $5E - in diesem Fall bei $9000 ein 4kB Fenster
bankx initialisiert dann jeweils die Banks - und immer jeweils für $D6.. und $D7.. weil hier die Option sta (baseadrr),y nicht funktioniert und zum Absturz führt.
Die einzelnen Banks sehen dann so aus:
;------------------------- Bank 0 Player-Set 1 -------------
ORG PMB
clc
ldx #0
jmp bankx
INI PMB
org $9000
.proc testbank0
inc 710
rts
.endp
ORG PMB ;------------------------- Bank 1 --------------
clc
ldx #1
jmp bankx
INI PMB
ORG $9000
.proc testbank1
inc 712
rts
.endp
und der Aufruf im Hauptprogramm:
ldy #$5f
lda #%10000000 ; oder einfach: lda #128
sta (baseaddr),y ; sta $d65f
start
jsr testbank0
jmp start
Keine Sorge, am Ende packe ich alles in einen zusammenhängenden Code mit Remarks....